package com.xiaoniu.forum.dao.es;


import com.xiaoniu.forum.common.WithIDEntity;
import com.xiaoniu.forum.common.utils.PageUtils;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;

import java.util.List;

/**
 * 操作ElasticSearch的通用接口
 */
public interface SearchDao {
    /**
     * @param indexName 索引名称
     * @param id    指定文档的id
     * @param obj   保存的对象 注意：必须是JavaBean对象，否则会出问题
     * @return
     */
    boolean save(String indexName,String id,Object obj);


    /**
     * 批量保存文档
     * @param indexName   索引名
     * @param entities    实体集合，实体必须实现WithIDEntity接口
     * @return
     */
    boolean bulkSave(String indexName,List<? extends WithIDEntity> entities);

    /**
     * @param indexName 索引名称
     * @param id    指定文档的id
     * @param obj   更新的对象
     * @return
     */
    boolean updateById(String indexName,String id,Object obj);


    /**
     * 批量更新文档
     * @param indexName   索引名
     * @param entities    实体集合，实体必须实现WithIDEntity接口
     * @return
     */
    boolean bulkUpdateById(String indexName,List<? extends WithIDEntity> entities);


    /**
     * @param indexName 索引名称
     * @param id    指定文档的id
     * @return
     */
    boolean deleteById(String indexName,String id);

    /**
     *
     * @param indexName 索引名称
     * @param id        指定文档的id
     * @param clazz     字节码对象
     * @param <T>       结果的类型   注意：必须是JavaBean对象，否则会出问题
     * @return
     */
    <T> T findById(String indexName,String id,Class<T> clazz);


    /**
     * 搜索,带分页
     * @param indexName              索引名称
     * @param searchSourceBuilder    检索条件
     * @param clazz                  字节码对象
     * @param <T>                    结果的类型  注意：必须是JavaBean对象，否则会出问题
     * @return
     */
    <T> void search(String indexName, SearchSourceBuilder searchSourceBuilder, PageUtils page,Class<T> clazz);

    /**
     * 高亮搜索，带分页
     * @param indexName              索引名称
     * @param searchSourceBuilder    检索条件
     * @param clazz                  字节码对象
     * @param <T>                    结果的类型  注意：必须是JavaBean对象，否则会出问题
     * @return
     */
    <T> void highlightSearch(String indexName, SearchSourceBuilder searchSourceBuilder,HighlightBuilder highlightBuilder, PageUtils page, Class<T> clazz);
}
